home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 292_03 / m11mch.c < prev    next >
C/C++ Source or Header  |  1990-07-16  |  6KB  |  375 lines

  1. /* m11mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6811.h"
  16.  
  17. /*
  18.  * Process a machine op.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register op, t1, t2;
  25.     struct expr e1, e2, e3;
  26.     struct area *espa;
  27.     char id[NCPS];
  28.     int c, reg, cpg, type, v1, v3;
  29.  
  30.     reg = 0;
  31.     cpg = 0;
  32.     op = mp->m_valu;
  33.     type = mp->m_type;
  34.     switch (type) {
  35.  
  36.     case S_SDP:
  37.         e1.e_mode = 0;
  38.         e1.e_flag = 0;
  39.         e1.e_addr = 0;
  40.         e1.e_base.e_ap = NULL;
  41.         espa = NULL;
  42.         if (more()) {
  43.             expr(&e1, 0);
  44.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  45.                 if (e1.e_addr) {
  46.                     err('b');
  47.                 }
  48.             }
  49.             if ((c = getnb()) == ',') {
  50.                 getid(id, -1);
  51.                 espa = alookup(id);
  52.                 if (espa == NULL) {
  53.                     err('u');
  54.                 }
  55.             } else {
  56.                 unget(c);
  57.             }
  58.         }
  59.         if (espa) {
  60.             outdp(espa, &e1);
  61.         } else {
  62.             outdp(dot.s_area, &e1);
  63.         }
  64.         lmode = SLIST;
  65.         break;
  66.  
  67.     case S_INH2:
  68.         outab(PAGE2);
  69.  
  70.     case S_INH:
  71.         outab(op);
  72.         break;
  73.  
  74.     case S_PUL:
  75.         v1 = admode(abdxy);
  76.         if (v1 == S_A) {
  77.             outab(op);
  78.             break;
  79.         }
  80.         if (v1 == S_B) {
  81.             outab(op+1);
  82.             break;
  83.         }
  84.         if (v1 == S_X) {
  85.             outab(op+6);
  86.             break;
  87.         }
  88.         if (v1 == S_Y) {
  89.             outab(PAGE2);
  90.             outab(op+6);
  91.             break;
  92.         }
  93.         aerr();
  94.         break;
  95.  
  96.     case S_BRA:
  97.         expr(&e1, 0);
  98.         outab(op);
  99.         if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
  100.             v1 = e1.e_addr - dot.s_addr - 1;
  101.             if ((v1 < -128) || (v1 > 127))
  102.                 aerr();
  103.             outab(v1);
  104.         } else {
  105.             outrb(&e1, R_PCR);
  106.         }
  107.         if (e1.e_mode != S_USER)
  108.             rerr();
  109.         break;
  110.  
  111.     case S_TYP1:
  112.         t1 = addr(&e1);
  113.         if (t1 == S_A) {
  114.             outab(op|A);
  115.             break;
  116.         }
  117.         if (t1 == S_B) {
  118.             outab(op|B);
  119.             break;
  120.         }
  121.         if (t1 == S_D) {
  122.             if (op == 0x44) {
  123.                 outab(0x04);
  124.                 break;
  125.             }
  126.             if (op == 0x48) {
  127.                 outab(0x05);
  128.                 break;
  129.             }
  130.             aerr();
  131.             break;
  132.         }
  133.         if (t1 == S_INDX || t1 == S_INDY) {
  134.             if (t1 == S_INDY)
  135.                 outab(PAGE2);
  136.             outab(op|X);
  137.             outrb(&e1, R_USGN);
  138.             break;
  139.         }
  140.         if (t1 == S_DIR || t1 == S_EXT) {
  141.             outab(op|0x30);
  142.             outrw(&e1, 0);
  143.             break;
  144.         }
  145.         aerr();
  146.         break;
  147.  
  148.     case S_TYP2:
  149.         if ((reg = admode(abdxy)) == 0)
  150.             aerr();
  151.  
  152.     case S_TYP3:
  153.         if (!reg) {
  154.             reg = op & 0x40;
  155.         } else
  156.         if (reg == S_A) {
  157.             reg = 0x00;
  158.         } else
  159.         if (reg == S_B) {
  160.             reg = 0x40;
  161.         } else
  162.         if (reg == S_D) {
  163.             if (op == 0x80) {
  164.                 op = 0x83;
  165.             } else
  166.             if (op == 0x8B) {
  167.                 op = 0xC3;
  168.             } else {
  169.                 aerr();
  170.             }
  171.             reg = 0x00;
  172.         } else {
  173.             aerr();
  174.             reg = 0x00;
  175.         }
  176.         t1 = addr(&e1);
  177.         if (t1 == S_IMMED) {
  178.             if ((op|0x40) == 0xC7)
  179.                 aerr();
  180.             if (op == 0x83 || op == 0xC3) {
  181.                 outab(op|reg);
  182.                 outrw(&e1, 0);
  183.             } else {
  184.                 outab(op|reg);
  185.                 outrb(&e1, 0);
  186.             }
  187.             break;
  188.         }
  189.         if (t1 == S_DIR) {
  190.             outab(op|reg|0x10);
  191.             outrb(&e1, R_PAG0);
  192.             break;
  193.         }
  194.         if (t1 == S_INDX || t1 == S_INDY) {
  195.             if (t1 == S_INDY)
  196.                 outab(PAGE2);
  197.             outab(op|reg|0x20);
  198.             outrb(&e1, R_USGN);
  199.             break;
  200.         }
  201.         if (t1 == S_EXT) {
  202.             outab(op|reg|0x30);
  203.             outrw(&e1, 0);
  204.             break;
  205.         }
  206.         aerr();
  207.         break;
  208.  
  209.     case S_TYP4:
  210.         t1 = addr(&e1);
  211.         if (t1 == S_IMMED) {
  212.             if (op&0x0D == 0x0D)
  213.                 aerr();
  214.             outab(op);
  215.             outrw(&e1, 0);
  216.             break;
  217.         }
  218.         if (t1 == S_DIR) {
  219.             outab(op|0x10);
  220.             outrb(&e1, R_PAG0);
  221.             break;
  222.         }
  223.         if (t1 == S_INDX || t1 == S_INDY) {
  224.             if (t1 == S_INDY)
  225.                 outab(PAGE2);
  226.             outab(op|0x20);
  227.             outrb(&e1, R_USGN);
  228.             break;
  229.         }
  230.         if (t1 == S_EXT) {
  231.             outab(op|0x30);
  232.             outrw(&e1, 0);
  233.             break;
  234.         }
  235.         aerr();
  236.         break;
  237.  
  238.     case S_TYP5:
  239.         t1 = addr(&e1);
  240.         if (t1 == S_INDX || t1 == S_INDY) {
  241.             if (t1 == S_INDY)
  242.                 outab(PAGE2);
  243.             outab(op);
  244.             outrb(&e1, R_USGN);
  245.             break;
  246.         }
  247.         if (t1 == S_EXT) {
  248.             outab(op|0x10);
  249.             outrw(&e1, 0);
  250.             break;
  251.         }
  252.         aerr();
  253.         break;
  254.  
  255.     case S_PG3:
  256.         cpg += (PAGE3-PAGE2);
  257.  
  258.     case S_PG2:
  259.         cpg += PAGE2;
  260.  
  261.     case S_TYP6:
  262.         t1 = addr(&e1);
  263.         if (t1 == S_IMMED) {
  264.             if (op == 0xCF)
  265.                 aerr();
  266.             if (cpg)
  267.                 outab(cpg);
  268.             outab(op);
  269.             outrw(&e1, 0);
  270.             break;
  271.         }
  272.         if (t1 == S_DIR) {
  273.             if (cpg)
  274.                 outab(cpg);
  275.             outab(op|0x10);
  276.             outrb(&e1, R_PAG0);
  277.             break;
  278.         }
  279.         if (t1 == S_INDX) {
  280.             if (cpg)
  281.                 outab(PAGE3);
  282.             outab(op|0x20);
  283.             outrb(&e1, R_USGN);
  284.             break;
  285.         }
  286.         if (t1 == S_INDY) {
  287.             if (cpg == PAGE2) {
  288.                 outab(PAGE2);
  289.             } else {
  290.                 outab(PAGE4);
  291.             }
  292.             outab(op|0x20);
  293.             outrb(&e1, R_USGN);
  294.             break;
  295.         }
  296.         if (t1 == S_EXT) {
  297.             if (cpg)
  298.                 outab(cpg);
  299.             outab(op|0x30);
  300.             outrw(&e1, 0);
  301.             break;
  302.         }
  303.         aerr();
  304.         break;
  305.  
  306.     case S_BTB:
  307.     case S_STCLR:
  308.         t1 = addr(&e1);
  309.         comma();
  310.         t2 = addr(&e2);
  311.         if (type == S_BTB) {
  312.             comma();
  313.             expr(&e3, 0);
  314.         }
  315.         if (t1 == S_DIR) {
  316.             outab(op);
  317.             outrb(&e1, R_PAG0);
  318.         } else
  319.         if (t1 == S_INDX || t1 == S_INDY) {
  320.             if (type == S_BTB) {
  321.                 op += 0x0C;
  322.             } else {
  323.                 op += 0x08;
  324.             }
  325.             if (t1 == S_INDY)
  326.                 outab(PAGE2);
  327.             outab(op);
  328.             outrb(&e1, R_USGN);
  329.         } else {
  330.             outab(op);
  331.             outrb(&e1, 0);
  332.             aerr();
  333.         }
  334.         if (t2 != S_IMMED)
  335.             aerr();
  336.         outrb(&e2, 0);
  337.         if (type == S_BTB) {
  338.             if (e3.e_base.e_ap == NULL || e3.e_base.e_ap == dot.s_area) {
  339.                 v3 = e3.e_addr - dot.s_addr - 1;
  340.                 if ((v3 < -128) || (v3 > 127))
  341.                     aerr();
  342.                 outab(v3);
  343.             } else {
  344.                 outrb(&e3, R_PCR);
  345.             }
  346.             if (e3.e_mode != S_USER)
  347.                 rerr();
  348.         }
  349.         break;
  350.  
  351.     default:
  352.         err('o');
  353.     }
  354. }
  355.  
  356.  
  357. /*
  358.  * The next character must be a
  359.  * comma.
  360.  */
  361. VOID
  362. comma()
  363. {
  364.     if (getnb() != ',')
  365.         qerr();
  366. }
  367.  
  368. /*
  369.  * Machine dependent initialization
  370.  */
  371. VOID
  372. minit()
  373. {
  374. }
  375.